#ifndef CLIENT_MANAGER_HPP
#define CLIENT_MANAGER_HPP

#include "DataTypes.hpp"
#include "Message.hpp"
#include <string>

#include <boost/thread/mutex.hpp>

namespace netspy
{




/**
 * @brief Klasa odpowiedzialna za bufforowanie klientów. Dostarcza interfejsy umożliwiające 
 * 	  rejestrację nowych klientów, sprawdzenie czy klient jest aktualnie w bazie danych
 *
 */
 
class ClientManager
{


public:

	/**
        	Możliwe statusy przyjęcia klienta
        */

	enum RegisterStatus
	{
		CLIENT_REJECTED = -1, /// odrzucenie klienta
		NEW_CLIENT = 0,       /// rejestracja nowego klienta
		FORCE_NEW_CLIENT = 1, /// wymuszenie ponownej rejestracij
		REUSE_CLIENT_HASH = 2 /// reużycie sesji
	};


	static ClientManager & getInstance()
	{
		static ClientManager clientManager;
	
		return clientManager;
	}


	/**
  
   	   Funkcja inicjująca bufor zawartością bazy danych

 	*/
	void initialize();
	
	
	/**
	  
	
		@return 
		
	*/

	RegisterStatus checkClient(const Message &message);

        /**
          
        
                @return 
                
        */

	std::string registerClient(const Message &message);	
	

	/**
          	Sprawdza stan ostatniej rejestracji
        
                @return zwraca true, jeśli odbyła się rejestracja nowego klienta
                
        */

	bool isClientUpdated() const;
	bool isServiceUpdated() const;

	client_vec_ptr  getClients();
	service_vec_ptr getServices();
	client_service_map_ptr getClientServiceMap();

private:

	ClientManager(){};
	ClientManager(ClientManager  &cm);
	ClientManager& operator=(const ClientManager&);

	/**
	   Funkcja generuje losowy hash dla nowo rejestrowanych klientów.
		
	   @return Zwraca 32znakowy string z hashem.

        */

	std::string generateHash();

	boost::mutex 	resouceMutex_;
	
	volatile bool isClientUpdated_;
	volatile bool isServiceUpdated_;
	client_vec_ptr clientBuffer_;
	service_vec_ptr serviceBuffer_;
	client_service_map_ptr serviceMapBuffer_;
	
};

}
#endif
